<?php
	namespace Utils;
	require_once './include/memcache.class.php';	/* memecache */
	require_once 'Spyc.php';
	use Driver\Cache\IMemcache as IMemcache;
	use Spyc as Spyc;
	/**
	* Download Class 下载类
	*/
	class Download
	{
		private $memcacheInstance = null;
		private $fileFullPath = '';
		private $filePath = '';
		private $fileName = '';
		private $fileTrueName = '';
		private $fileSize = '';
		private $fileTruePath = '';
		const SETTING_FILES_NAME = 'files.yaml';

		function __construct($fileFullPath)
		{
			$this->memcacheInstance = IMemcache::getInstance();
			$this->fileFullPath = $fileFullPath;	//	文件全路径加名称
			$this->filePath = pathinfo($fileFullPath)['dirname'];	//文件路径
			$this->fileName = pathinfo($fileFullPath)['basename'];	//文件名称
			$this->fileSize = 0;	//文件大小
			$this->fileSetting = [];	//文件配置信息
			// 检查文件
			$checkCode = $this->loadFileSetting();	//加载文件设置
			//////////////////////////////////////////////
			$this->getFileTrueName();	//获取文件真实名称
			$this->fileTruePath = $this->filePath .'/'. iconv('UTF-8', 'GBK', $this->fileTrueName);
			//////////////////////////////////////////////
			if(!$this->checkFileExists()){
				header('Location: http://'. $_SERVER['HTTP_HOST'] .'/' . 'error.php');
			}
			$this->getFileSize();		//获取文件大小
		}
		/**
		* 检查文件是否存在
		*/
		function checkFileExists(){
			if(!file_exists($this->fileFullPath))
			{
				if( !file_exists($this->fileTruePath) )
				{
					return false;
				}
			}
			return true;
		}
		/**
		* 加载文件配置文件
		*/
		function loadFileSetting(){
			$setting_files_path = $this->filePath . '/' . self::SETTING_FILES_NAME;	//配置文件路径 相对于当前执行的脚本
			//1. 判断 目录下 是否有配置文件
			if( file_exists($setting_files_path)){
				//1-1. 如果 有 检查 Memcache 中是否存在,该配置文件的缓存
				$dataKey = sha1($this->filePath);
				
				if( ! $fileData = $this->memcacheInstance->get( $dataKey ) )
				{
					$loadData = Spyc::YAMLLoad( $setting_files_path );
					//1-2. 如果没有就读取配置文件信息,并将信息写入带Memcache缓存中 以当前文件全路径 的 sha1 HashCode 作为 key 存储
					$this->memcacheInstance->set( $dataKey , $loadData , 0, 3600);

					$fileData = $loadData;
				}
				// 检查 请求文件名 是否在 载文件列表中
				if( array_key_exists( $this->fileName , $fileData['files'])){
					$this->fileSetting = $fileData['files'][ $this->fileName ];
					//配置信息存在
					return 1;
				}
			}else{
				// 配置文件不存在， 返回值为 1
				return 0;
			}
		}
		/**
		* 获取文件真实名称
		*/
		function getFileTrueName(){
			if( !array_key_exists('trueName', $this->fileSetting) )
			{	//是否存在trueName字段
				// 文件没有 trueName 相关配置
				$this->fileTrueName = $this->fileName;
				return 1;
			}else{
				//存在 文件 trueName 字段
				$this->fileTrueName = $this->fileSetting['trueName'];
				return 2;
			}
		}
		/**
		* 获取文件大小
		*/
		function getFileSize(){
			// 以配置文件为准
			if(array_key_exists('size', $this->fileSetting))
			{
				// 获取配置文件 文件大小
				$this->fileSize = $this->fileSetting['size'];
				return 1;
			}else{
				// 获取文件真实大小
				$this->fileSize = filesize($this->fileTruePath);
				return 2;
			}
		}
		function download(){
			if(!$this->checkFileExists()){
				//echo $this->fileTruePath;
				header('Location: http://'. $_SERVER['HTTP_HOST'] .'/' . 'error.php');
			}
		     $file_size = $this->fileSize;
		     $downloadFileName = $this->fileTrueName;
		     header("Content-type: application/octet-stream; charset=UTF-8");
		     header("Content-Length: {$file_size}");
		     header("Accept-Ranges: bytes");
		     header("Content-Disposition: attachment; filename={$downloadFileName}");
		     
		     $fp = fopen($this->fileTruePath, "r");

		     $buffer_size = 1024;
		     $cur_pos = 0;
		     
		     while(!feof($fp) && $file_size - $cur_pos > $buffer_size ) { 
		         $buffer = fread($fp, $buffer_size);
		         echo $buffer;
		         $cur_pos += $buffer_size;
		     }
		     
		     $buffer = fread($fp, $file_size - $cur_pos);
		     echo $buffer;
		     fclose($fp);
		     return true;
		}
	}

	
